package com.weiai.wedding.service.user;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.weiai.wedding.dao.user.AuthDao;
import com.weiai.wedding.dao.user.AuthExpaDao;
import com.weiai.wedding.dao.user.UserDao;
import com.weiai.wedding.entity.user.Auth;
import com.weiai.wedding.entity.user.MenuTree;
import com.weiai.wedding.entity.user.User;
import com.weiai.wedding.service.ShiroDbRealm;
import com.weiai.wedding.service.ShiroDbRealm.ShiroUser;
import com.weiai.wedding.util.ConUtils;

/**
 * 查询权限菜单
 * @author wangweiheng
 *
 */
@Component
//默认将类中的所有public函数纳入事务管理.
@Transactional(readOnly = true)
public class AuthService {
	private static Logger logger = LoggerFactory.getLogger(AuthService.class);
	
	@Autowired
	private AuthExpaDao authExpaDao;
	@Autowired
	private AuthDao authDao;
	@Autowired
	private UserDao userDao;
	@Autowired
	private ShiroDbRealm shiroRealm;
	/**
	 * 查询权限菜单信息
	 * @param loginName
	 * @return
	 */
	public List<MenuTree> getAuth(String loginName){
		List<Object[]> list = authExpaDao.findListByLoginName(loginName);
		List<MenuTree> treeList = new ArrayList();
		if(list!=null && list.size()>0){
			for(int i=0;i<list.size();i++){
				Object[] obj = list.get(i);
				if(obj!=null){
					String authCode = (String) obj[0];
					String authName = (String) obj[1];
					String authParentCode = (String) obj[3];
					String menuAddr = (String) obj[4];
					MenuTree tree = new MenuTree();
					tree.setId(authCode);
					tree.setName(authName);
					tree.setpId(authParentCode);
					if(authParentCode==null || "".equals(authParentCode)){
						tree.setOpen(true);
						tree.setpId("");
					}
					tree.setMenuAddr(menuAddr);
					treeList.add(tree);
				}
			}
		}
		return treeList;
	}
	/**
	 * 保存权限
	 * @param auth
	 */
	@Transactional(readOnly = false)
	public void saveAuth(Auth auth){
		if(auth.getSortId()==null || auth.getSortId()==0){
			auth.setSortId(getSortId());
		}
		authDao.save(auth);
		shiroRealm.clearAllCachedAuthorizationInfo();
	}
	
	/**
	 * 校验编码是否已经存在
	 * @param authCode
	 * @return
	 */
	public List checkAuth(String authCode){
		List list = authDao.findAuthByAuthCode(authCode);
		return list;
	}
	
	
	/**
	 * 查询权限实例
	 * @param authId
	 * @return
	 */
	public Auth getAuthById(Long authId){
		
		return authDao.findOne(authId);
	}
	
	/**
	 * 检查权限编码是否在使用中
	 * @param authId
	 * @return
	 */
	public boolean chechDelete(Long authId){
		Auth auth = authDao.findOne(authId);
		List<User> userLlist = userDao.findUserByAuthCode(auth.getAuthCode());
		if( userLlist!=null && userLlist.size()>0)
			return false;
		return true;
	}
	
	/**
	 * 删除权限信息
	 * @param authId
	 */
	@Transactional(readOnly = false)
	public void deleteAuth(Long authId){
		
		authDao.delete(authId);
		shiroRealm.clearAllCachedAuthorizationInfo();
	}
	/**
	 * 查询权限表所有信息 
	 * userId 可选
	 * @return 
	 */
	public List<MenuTree> getAllAuth(String userId){
		ShiroUser su=ConUtils.getUser();
		User user = userDao.findByLoginName(su.getLoginName());
		//查找所有的权限
		List<Auth> allList = authDao.findAll();
		//查找当前用户的所拥有权限
		List<Auth> list=new ArrayList<Auth>();
		if("admin".equals(user.getLoginName())){
			list=allList;
		}else{
			for(Auth auth:allList){
				List<String> userAuthList = user.getAuthList();
				if(userAuthList!=null && userAuthList.size()>0){
					for(String authCode:userAuthList){
						if(authCode.equals(auth.getAuthCode())){
							list.add(auth);
						}
					}
				}
			}
		}
		List<MenuTree> treeList = new ArrayList();
		User u =null;
		if(userId!=null){
			u = userDao.findOne(userId);
		}
		if(list!=null && list.size()>0){
			for(Auth auth:list){
				if(auth!=null){
					MenuTree tree = new MenuTree();
					tree.setId(auth.getAuthCode());
					tree.setName(auth.getAuthName());
					tree.setpId(auth.getAuthParentCode());
					if("A".equals(auth.getAuthType())){
						//如果是菜单权限，则节点全部展开
						tree.setOpen(true);
					}
					if(u!=null){
						List<String> authList = u.getAuthList();
						if(authList!=null && authList.size()>0){
							for(String authCode:authList){
								if(authCode.equals(auth.getAuthCode())){
									tree.setChecked(true);
								}
							}
						}
					}
					treeList.add(tree);
				}
			}
		}
		return treeList;
	}
	
	public List<MenuTree> getAllViewUserAuth(String id) {
		User user =null;
		if(id!=null){
			user = userDao.findOne(id);
		}
		//查找所有的权限
		List<Auth> allList = authDao.findAll();
		//查找当前用户的所拥有权限
		List<Auth> list=new ArrayList<Auth>();
		for(Auth auth:allList){
			if(user!=null){
				List<String> userAuthList = user.getAuthList();
				if(userAuthList!=null && userAuthList.size()>0){
					for(String authCode:userAuthList){
						if(authCode.equals(auth.getAuthCode())){
							list.add(auth);
						}
					}
				}
			}
		}
		List<MenuTree> treeList = new ArrayList();
		if(list!=null && list.size()>0){
			for(Auth auth:list){
				if(auth!=null){
					MenuTree tree = new MenuTree();
					tree.setId(auth.getAuthCode());
					tree.setName(auth.getAuthName());
					tree.setpId(auth.getAuthParentCode());
					if("A".equals(auth.getAuthType())){
						tree.setOpen(true);
					}
					treeList.add(tree);
				}
			}
		}
		return treeList;
	}
//	

//	

//


//	/**
//	 * 无条件查询权限所有信息
//	 * @return
//	 */
//	public Page<Auth> getAuthAll(Pageable pager){
//		Page<Auth> page = authDao.findAll(pager);
//		return page;
//	}
//	
//	/**
//	 * 根据权限名称查询
//	 * @param authName
//	 * @return
//	 */
//	public Page<Auth> getAuthAllByName(String authName,Pageable pager){
//		
//		return authDao.findListByAuthName("%"+authName+"%",pager);
//	}
//	

//	
//	/**
//	 * 检查权限编码是否在使用中
//	 * @param authId
//	 * @return
//	 */
//	public boolean checkDelete(Long authId){
//		Auth auth = authDao.findOne(authId);
//		List<User> userLlist = userDao.findUserByAuthCode(auth.getAuthCode());
//		if( userLlist!=null && userLlist.size()>0)
//			return false;
//		return true;
//	}
//
//	public List<MenuTree> getAllCreateAuth(Long deptId) {
//		Dept d=deptDao.findOne(deptId);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(d!=null){
//						List<String> userAuthList = d.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}
//
//	public List<MenuTree> getAllUpdateAuth(Long deptId, Long userId) {
//		Dept d=deptDao.findOne(deptId);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(d!=null){
//						List<String> userAuthList = d.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		User user = new User();
//		if(userId!=null){
//			user = userDao.findOne(userId);
//		}
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					if(user!=null){
//						List authList = user.getAuthList();
//						if(authList!=null && authList.size()>0){
//							for(int i=0;i<authList.size();i++){
//								String authCode = (String) authList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									tree.setChecked(true);
//								}
//							}
//						}
//					}
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}
//
//	public List<MenuTree> getAllUpdateCpAuth(Long deptId, Long cpId) {
//		Dept d=deptDao.findOne(deptId);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(d!=null){
//						List<String> userAuthList = d.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		CP cp = new CP();
//		if(cpId!=null){
//			cp = cpDao.findOne(cpId);
//		}
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					if(cp!=null){
//						List authList = cp.getAuthList();
//						if(authList!=null && authList.size()>0){
//							for(int i=0;i<authList.size();i++){
//								String authCode = (String) authList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									tree.setChecked(true);
//								}
//							}
//						}
//					}
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}
//
//	public List<MenuTree> getAllCreateCpUserAuth(Long id) {
//		CP cp=cpDao.findOne(id);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(cp!=null){
//						List<String> userAuthList = cp.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}
//
//	public List<MenuTree> getAllUpdateCpUserTreeAuth(Long cpId, Long userId) {
//		CP cp=cpDao.findOne(cpId);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(cp!=null){
//						List<String> userAuthList = cp.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		User user = new User();
//		if(userId!=null){
//			user = userDao.findOne(userId);
//		}
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					if(user!=null){
//						List authList = user.getAuthList();
//						if(authList!=null && authList.size()>0){
//							for(int i=0;i<authList.size();i++){
//								String authCode = (String) authList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									tree.setChecked(true);
//								}
//							}
//						}
//					}
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}
//	
//

//
//	public List<MenuTree> getAllViewDeptAuth(Long deptId) {
//		Dept dept =null;
//		if(deptId!=null){
//			dept = deptDao.findOne(deptId);
//		}
//		//Dept d=deptDao.findOne(deptId);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(dept!=null){
//						List<String> userAuthList = dept.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}
//
//	public List<MenuTree> getAllViewCpAuth(Long cpId) {
//		CP cp =null;
//		if(cpId!=null){
//			cp = cpDao.findOne(cpId);
//		}
//		//Dept d=deptDao.findOne(deptId);
//		//查找所有的权限
//		List<Auth> allList = authDao.findAll();
//		//查找当前用户的所拥有权限
//		List<Auth> list=new ArrayList<Auth>();
//		if(allList!=null && allList.size()>0){
//			for(Auth auth:allList){
//				if(auth!=null){
//					if(cp!=null){
//						List<String> userAuthList = cp.getAuthList();
//						if(userAuthList!=null && userAuthList.size()>0){
//							for(int i=0;i<userAuthList.size();i++){
//								String authCode = (String) userAuthList.get(i);
//								if(authCode.equals(auth.getAuthCode())){
//									list.add(auth);
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		List<MenuTree> treeList = new ArrayList();
//		if(list!=null && list.size()>0){
//			for(Auth auth:list){
//				if(auth!=null){
//					MenuTree tree = new MenuTree();
//					tree.setId(auth.getAuthCode());
//					tree.setName(auth.getAuthName());
//					tree.setpId(auth.getAuthParentCode());
//					if("A".equals(auth.getAuthType())){
//						//如果是菜单权限，则节点全部展开
//						tree.setOpen(true);
//					}
//					treeList.add(tree);
//				}
//			}
//		}
//		return treeList;
//	}

	public Page<Auth> getAuthAllMan(Pageable pageable) {
		Page<Auth> page = authDao.findAllMan(pageable);
		return page;
	}

	public Page<Auth> getAuthAllManByName(String authName, Pageable pageable) {
		return authDao.findListManByAuthName("%"+authName+"%",pageable);
	}

	public Page<Auth> getAuthMenuByAuthCode(String authCode, Pageable pageable) {
		Page<Auth> page = authDao.findListMenuByAuthCode(authCode,pageable);
		return page;
	}

	public Page<Auth> getAuthMenuByAuthCodeAndName(String authCode, String authName,
			Pageable pageable) {
		return authDao.findListMenuByAuthCodeAndName(authCode,"%"+authName+"%",pageable);
	}

	public Auth getAuthByCode(String authCode) {
		// TODO Auto-generated method stub
		List list= authDao.findAuthByAuthCode(authCode);
		if(list!=null && list.size()>0){
			return (Auth) list.get(0);
		}
		return null;
	}

	public Auth getMoveDownAuthForMan(Long sortId) {
		// TODO Auto-generated method stub
		List list= authDao.findMoveDownAuthForMan(sortId);
		if(list!=null && list.size()>0){
			return (Auth) list.get(0);
		}
		return null;
	}

	public Auth getMoveDownAuthForMenu(String authParentCode,Long sortId) {
		List list= authDao.findMoveDownAuthForMenu(authParentCode,sortId);
		if(list!=null && list.size()>0){
			return (Auth) list.get(0);
		}
		return null;
	}

	public Auth getMoveUpAuthForMan(Long sortId) {
		// TODO Auto-generated method stub
		List list= authDao.findMoveUpAuthForMan(sortId);
		if(list!=null && list.size()>0){
			return (Auth) list.get(0);
		}
		return null;
	}

	public Auth getMoveUpAuthForMenu(String authParentCode, Long sortId) {
		// TODO Auto-generated method stub
		List list= authDao.findMoveUpAuthForMenu(authParentCode,sortId);
		if(list!=null && list.size()>0){
			return (Auth) list.get(0);
		}
		return null;
	}
	private Long getSortId() {
	// TODO Auto-generated method stub
	List<Auth> list=authDao.findAllAuth();
	if(list!=null && list.size()>0){
		return list.get(0).getSortId()+1;
	}
	return 1L;
}
}
